#include "comm.hpp"

extern Log mylog;

int main()
{
    Init init;  // 创建命名管道
    int shmid = CreateShm();  // 创建共享内存
    // 将共享内存映射到进程地址空间
    char *shmaddr = (char*)shmat(shmid, nullptr, 0);

    // 以只读方式打开命名管道
    int fd = open(FIFO_FILE, O_RDONLY);
    if (fd < 0)
    {
        mylog(Fatal, "error string: %s, error code: %d", strerror(errno), errno);
        exit(FIFO_OPEN_ERR);
    }

    struct shmid_ds shmds;
    while(true)
    {
        // 读取管道中的通知
        char c;
        ssize_t s = read(fd, &c, 1);
        if(s == 0) break;  // 写端关闭
        else if(s < 0) break;  // 读取错误

        // 直接从共享内存读取数据
        cout << "client say@ " << shmaddr << endl;
        sleep(1);

        // 获取并打印共享内存的状态信息
        shmctl(shmid, IPC_STAT, &shmds);
        cout << "shm size: " << shmds.shm_segsz << endl;
        cout << "shm nattch: " << shmds.shm_nattch << endl;
        printf("shm key: 0x%x\n",  shmds.shm_perm.__key);
        cout << "shm mode: " << shmds.shm_perm.mode << endl;
    }

    // 清理资源
    shmdt(shmaddr);  // 解除内存映射
    shmctl(shmid, IPC_RMID, nullptr);  // 删除共享内存
    close(fd);  // 关闭管道
    return 0;
}